package com.sykj.why.mongo.service.impl;

import com.sykj.why.exception.WhyException;
import com.sykj.why.mongo.dao.ContentCategoryTDao;
import com.sykj.why.mongo.document.entity.CertificationLevelT;
import com.sykj.why.mongo.document.entity.ContentCategoryT;
import com.sykj.why.mongo.dto.PageDTO;
import com.sykj.why.mongo.enums.exception.ResultEnum;
import com.sykj.why.mongo.service.ContentCategoryTService;
import com.sykj.why.mongo.vo.entity.ContentCategoryTVo;
import com.sykj.why.util.BaseTools;
import com.sykj.why.util.DateTool;
import com.sykj.why.util.Page;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Eleven
 * @date 2019/6/4
 * @desc 内容类型业务实现层
 */

@Service("ContentCategoryTService")
public class ContentCategoryTServiceImpl extends BasicServiceImpl<ContentCategoryT> implements ContentCategoryTService {

    @Autowired
    private ContentCategoryTDao contentCategoryTDao;

    /**
     * 添加内容类型
     * @param contentCategoryT
     */
    @Override
    public void saveContentCategory(ContentCategoryT contentCategoryT) {
        //验证内容类型名称是否重复
        verifyName(contentCategoryT);
        //排序
        long count = contentCategoryTDao.count(ContentCategoryT.class, false);
        contentCategoryT.setSort((int) count);
        //设置时间
        contentCategoryT.setCreateTime(DateTool.getSystemTime());
        contentCategoryT.setUpdateTime(DateTool.getSystemTime());
        //保存
        contentCategoryTDao.save(contentCategoryT);
    }

    /**
     * 删除内容类型
     * @param id
     */
    @Override
    public void removeContentCategory(String id) {
        //通过Id查询内容类型
        ContentCategoryT contentCategoryT = findById(id);
        //逻辑删除内容类型
        contentCategoryTDao.remove(contentCategoryT);
    }

    /**
     * 修改内容类型
     * @param contentCategoryT
     */
    @Override
    public void updateContentCategory(ContentCategoryT contentCategoryT) {
        //通过id查询内容类型
        ContentCategoryT contentCategory = findById(contentCategoryT.getId());
        //重新赋值
        //验证内容类型名称是否重复
        verifyName(contentCategoryT);
        contentCategory.setCategoryName(contentCategoryT.getCategoryName());
        contentCategory.setUrl(contentCategoryT.getUrl());
        contentCategory.setUpdateTime(DateTool.getSystemTime());
        //保存或修改
        contentCategoryTDao.saveOrupdate(contentCategory);
    }

    /**
     * 启用/禁用内容类型
     * @param id
     * @param flag
     */
    @Override
    public void disableOrEnable(String id, boolean flag) {
        //通过id查询内容类型
        ContentCategoryT contentCategoryT = findById(id);
        //修改状态
        contentCategoryTDao.disableOrEnable(contentCategoryT,flag);
    }

    /**
     * 验证内容类型名称是否重复
     * @param contentCategoryT
     */
    @Override
    public void verifyName(ContentCategoryT contentCategoryT) {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").ne(contentCategoryT.getId()).
                and("categoryName").is(contentCategoryT.getCategoryName()).and("removed").is(false));
        ContentCategoryT contentCategory = contentCategoryTDao.findOne(query,ContentCategoryT.class);
        if (contentCategory != null) {
            throw new WhyException(ResultEnum.REPEAT);
        }
    }

    /**
     * 通过id查询内容类型
     * @param id
     * @return
     */
    @Override
    public ContentCategoryT findById(String id) {
        //通过id查询未删除的内容类型
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(id).and("removed").is(false));
        ContentCategoryT contentCategoryT = contentCategoryTDao.findOne(query,ContentCategoryT.class);
        if (contentCategoryT!=null){
            return contentCategoryT;
        }else {
            throw new WhyException(ResultEnum.OBJISNULL);
        }
    }

    /**
     * 通过id查询内容类型
     * @param id
     * @return
     */
    @Override
    public ContentCategoryT findCategoryById(String id) {
        //通过id查询未删除的内容类型
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(id).and("removed").is(false));
        ContentCategoryT contentCategoryT = contentCategoryTDao.findOne(query,ContentCategoryT.class);
        return contentCategoryT;
    }

    /**
     * 查询所有内容类型
     * @return
     */
    @Override
    public List<ContentCategoryT> findAll() {
        //查询未删除和未禁用的所有内容类型
        Query query = new Query();
        query.addCriteria(Criteria.where("removed").is(false).and("enable").is(true));
        List<ContentCategoryT> list = contentCategoryTDao.findAll(query,ContentCategoryT.class);
        return list;
    }

    /**
     * 分页查询内容类型
     * @param pageDTO
     * @return
     */
    @Override
    public Page findByPage(PageDTO pageDTO) {
        //查询未删除的内容类型，并分页传给视图
        Query query = new Query();
        query.addCriteria(Criteria.where("removed").is(false));
        long count = contentCategoryTDao.count(query, ContentCategoryT.class);
        List<ContentCategoryTVo> list = new ArrayList<>();
        for (ContentCategoryT contentCategoryT : contentCategoryTDao.findByPage(query, pageDTO, ContentCategoryT.class)) {
            ContentCategoryTVo vo = new ContentCategoryTVo();
            BeanUtils.copyProperties(contentCategoryT, vo);
            vo.setCreateTime(BaseTools.longToString(contentCategoryT.getCreateTime()));
            vo.setUpdateTime(BaseTools.longToString(contentCategoryT.getUpdateTime()));
            list.add(vo);
        }
        return new Page(pageDTO, count, list);
    }

}
